<?php
def("amicitia/arquitectura/","Comando");
def("amicitia/arquitectura/excepciones/","RequestMalFormadoException");

/**
 * InterpreteUrl se encarga de interpretar el request e instanciar un Comando
 * a partir de dicho request.
 *
 * @author Willy A. Kuster
 */
class InterpreteUrl {

	private $request;
	private $scriptName;

	/**
	 * Separa el request del query string y toqueniza el request y el script
	 * name. 
	 */
	public function __construct() {
		$RequestConQuery = explode('?',$_SERVER['REQUEST_URI']);
		$this->request = explode('/',$RequestConQuery[0]);
		$this->scriptName = explode('/',$_SERVER['SCRIPT_NAME']);
	}

	/**
	 * Interpreta y valida la estructura de un request.
	 *
	 * @return Una nueva instancia de Comando basada en la interpretación del
	 * request.
	 */
	public function interpretar() {

		$interseccion = array_diff_assoc($this->request,$this->scriptName);

		$arregloComando=array_values($interseccion);

		$mapeoAccion="";
		$nombreMetodo="";
		if (sizeof($arregloComando)>0) {
			$mapeoAccion=$arregloComando[0];
		}
		if (sizeof($arregloComando)>1) {
			$nombreMetodo=$arregloComando[1];
		}
		
		$palabraValida="/^\w+$/";
		if (sizeof($arregloComando)>2 ||
		($mapeoAccion!="" && preg_match($palabraValida, $mapeoAccion)!=1) ||
		($nombreMetodo!="" && preg_match($palabraValida, $nombreMetodo)!=1)) {
			throw new RequestMalFormadoException($_SERVER['REQUEST_URI']);
		}

		return new Comando($mapeoAccion, $nombreMetodo);
	}
}
?>